import { tabBarUrls } from "@/config"

let _debounceTimeout = null, 
	_throttleRunning = false;

/**
 * 防抖
 * 
 * @param {Function} 执行函数
 * @param {Number} delay 延时ms   
 */
export const debounce = (fn, delay = 500) => {
	clearTimeout(_debounceTimeout)
	_debounceTimeout = setTimeout(() => {
		fn()
	}, delay)
}

/**
 * 节流
 * 
 * @param {Function} 执行函数
 * @param {Number} delay 延时ms  
 */
export const throttle = (fn, delay = 500) => {
	if (_throttleRunning) {
		return;
	}
	_throttleRunning = true;
	fn()
	setTimeout(() => {
		_throttleRunning = false;
	}, delay)
}

/**
 * 登录提示框
 */
export const showLoginDialog = () => {
	uni.showModal({
		title: "温馨提示",
		content: '您还未登录，请登录后再操作',
		cancelText: '再逛逛',
		confirmText: '去登录',
		success: (res) => {
			if (res.confirm) {
				jumpTo('/pages/public/login')
			}
		}
	})
}

/**
 * 路由跳转
 * 
 * @param {url} String 链接
 */
export const jumpTo = (url) => {

	//判断是tabBar
	for (let key in tabBarUrls) {
		if(url.indexOf('/' + tabBarUrls[key]) === 0){
			//跳转tabBar
			uni.switchTab({
				url
			})
			return false
		}
	}

	//跳转页面
	uni.navigateTo({
		url
	})
}

/**
 * Toast
 * 
 * @param {title} String 提示的内容，长度与 icon 取值有关
 * @param {duration} Object 提示的延迟时间，单位毫秒，默认：1500
 * @param {mask} Object 是否显示透明蒙层，防止触摸穿透，默认：false
 * @param {icon} String 图标: success | loading | node(默认)
 */
export const msg = (title = '', duration = 1500, mask = false, icon = 'none') => {
	if(!title) return false
	uni.showToast({
		title,
		duration,
		mask,
		icon
	})
}

/**
 * Loading
 * 
 * @param {title} String 提示的文字内容，显示在loading的下方
 * @param {mask} Object 是否显示透明蒙层，防止触摸穿透，默认：false
 */
export const loading = (title = '', mask = false) => {
	if(!title) return false
	uni.showLoading({
		title,
		mask
	})
}

/**
 * 获取页面栈
 * 
 * @param {Number} preIndex为1时获取上一页
 * @return {Object} 
 */
export const prePage = (preIndex = 1) => {
	const pages = getCurrentPages();
	const prePage = pages[pages.length - (preIndex + 1)];

	return prePage.$vm;
}

/**
 * 判断类型集合
 * 
 * @param {str} String 内容
 * @param {type} String 判断类型
 */
export const checkStr = (str, type) => {
	switch (type) {
		case 'mobile': //手机号码
			return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
		case 'tel': //座机
			return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
		case 'card': //身份证
			return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
		case 'mobileCode': //6位数字验证码
			return /^[0-9]{6}$/.test(str)
		case 'pwd': //密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
			return /^([a-zA-Z0-9_]){6,18}$/.test(str)
		case 'payPwd': //支付密码 6位纯数字
			return /^[0-9]{6}$/.test(str)
		case 'postal': //邮政编码
			return /[1-9]\d{5}(?!\d)/.test(str);
		case 'QQ': //QQ号
			return /^[1-9][0-9]{4,9}$/.test(str);
		case 'email': //邮箱
			return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
		case 'money': //金额(小数点2位)
			return /^\d*(?:\.\d{0,2})?$/.test(str);
		case 'URL': //网址
			return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
		case 'IP': //IP
			return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);
		case 'date': //日期时间
			return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
		case 'number': //数字
			return /^[0-9]$/.test(str);
		case 'english': //英文
			return /^[a-zA-Z]+$/.test(str);
		case 'chinese': //中文
			return /^[\\u4E00-\\u9FA5]+$/.test(str);
		case 'lower': //小写
			return /^[a-z]+$/.test(str);
		case 'upper': //大写
			return /^[A-Z]+$/.test(str);
		case 'HTML': //HTML标记
			return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
		default:
			return true;
	}
}
